#define  _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>


//int main()
//{
//	int arr[5] = { 1,2,3,4,5 };
//	int* p = (int*)(&arr + 1);
//	printf("%d, %d\n", *(arr + 1), *(p - 1));
//
//	return 0;
//}


//在×86环境下
//假设结构体大小是20字节
//struct Test
//{
//	int Num;
//	char* pcName;
//	short sDate;
//	char cha[2];
//	short sBa[4];
//}*p = (struct Test*)0x100000 ;
//
//int main()
//{
//	printf("%p\n", p + 0x1);//跳过一个结构体的大小 +20 --> +0x14
//	printf("%p\n", (unsigned long)p + 0x1);//不再是指针，而是无符号整数+1
//	printf("%p\n", (unsigned int*)p + 0x1);//
//	//00100014
//	//00100001
//	//00100004
//
//	return 0;
//}


//int main()
//{
//	int a[3][2] = { (0,1),(2,3), (4,5) }; // --> 逗号表达式
//	int* p;
//	p = a[0];
//    printf("%d\n", p[0]);
//
//	// 1  3
//	// 5  0
//	// 0  0
//
//	int b[3][2] = { {0,1},{2,3}, {4,5} };
//	int* q;
//	q = b[0];
//    printf("%d\n", q[0]);
//
//	return 0;
//}


//假设环境是×86环境
//int main()
//{
//	int a[5][5];
//	int(*p)[4]; //数组指针
//	p = a;
//	printf("%p, %d\n", &p[4][2] - &a[4][2], &p[4][2] - &a[4][2]);
//	//FF FF FF FC  ,  -4
//
//	return 0;
//}


//int main()
//{
//	int arr[2][5] = { 1,2,3,4,5,6,7,8,9,10 };
//	int* p1 = (int*)(&arr + 1);
//	int* p2 = (int*)(*(arr + 1));//aa + 1 --> aa[1] --> 第二行地址
//	printf("%d, %d\n", *(p1 - 1), *(p2 - 1));//10，5
//
//	return 0;
//}


//int main()
//{
//	const char* a[] = { "work", "at", "alibaba" };
//	const char** pa = a;
//	pa++;
//    printf("%s\n", *pa);
//
//	return 0;
//}


int main()
{
	const char* c[] = { "enter", "new", "point", "first" };
	const char** cp[] = { c + 3, c + 2, c + 1, c };
	const char*** cpp = cp;
    printf("%s\n", **++cpp);//*(*(++cpp))
    printf("%s\n", *-- * ++cpp + 3);//(*(--(*(++cpp)))) + 3
    printf("%s\n", *cpp[-2] + 3);//* (*(cpp - 2)) + 3
    printf("%s\n", cpp[-1][-1] + 1);//(*( *(cpp - 1) - 1)) + 1

	//画图！！！

	return 0;
}

